Account Factory for Terraform (AFT)のパイプラインを久しぶりに実行したらエラーになったから復旧させてみた([ERROR] IndexError: list index out of range Traceback)
AFTを使って既存のアカウントに対して、カスタマイズを実行する機会がありました。
AFTのバージョンの関係で少しハマるところがあったので、ブログにします。
作業内容は以下のブログが分かりやすいです。
Account Factory for Terraform (AFT) で AWSアカウントのカスタマイズを試してみた | DevelopersIO
1.アカウントカスタムリポジトリにコードを追加 2.リクエストリポジトリにパラメータを追加 3.手動でStep Functionsステートマシンを実行
環境情報
- AFT: 1.9.2
エラー1: カスタマイズパイプライン実行用のStepFunctionsでエラーがでる
「3.手動でStep Functionsステートマシンを実行」この手順を実施した際に、Step Functionsaft-invoke-customizations
が失敗しました。
詳しく見てみると、Lambda関数aft-customizations-execute-pipeline
が失敗したようです。
[ERROR] IndexError: list index out of range Traceback (most recent call last): File "/var/task/aft_customizations_execute_pipeline.py", line 37, in lambda_handler
途方にくれながら調べていたら、以下のIssueがありました。
AFT v1.11以前では、最後の実行から1 年以上実行されていないカスタマイズパイプラインを実行する際にStep Functionsステートマシンaft-invoke-customizations
が実行されると、Lambda関数aft-customizations-execute-pipeline
はトレースバックを生成してLambda関数が失敗するようです。
v1.11以降にAFTをバージョンアップすれば解消するようです。
作業時点では、v1.12が最新だったため、v1.12へアップデートすることにしました。
エラー2: Cycleエラー
v1.12へのアップデートも少し苦戦しました。以下のようにバージョンを変更します。
module "aft" { source = "aws-ia/control_tower_account_factory/aws" - version = "1.9.2" + version = "1.12.0" ...
$ terraform init -upgrade
必要に応じて、AWS Providerのバージョンアップも行います。
バージョンアップが終わったらPlanを実行します。
$ terraform plan
Cycleエラーが起きています。
│ Error: Cycle: module.aft.module.aft_feature_options.aws_lambda_function.aft_enroll_support (expand), module.aft.module.aft_feature_options.aws_lambda_function.aft_enroll_support, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_invoke_aft_account_provisioning_framework (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_invoke_aft_account_provisioning_framework, module.aft.module.aft_customizations.aws_sfn_state_machine.aft_invoke_customizations_sfn (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_identify_targets, module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_execute_pipeline (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_identify_targets (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_get_pipeline_executions (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_get_pipeline_executions, module.aft.module.aft_customizations.local.replacements_map (expand), module.aft.module.aft_customizations.aws_sfn_state_machine.aft_invoke_customizations_sfn, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_processor (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_processor, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_controltower_event_logger (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_controltower_event_logger, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_audit_trigger (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_audit_trigger, module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_action_trigger (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_account_request_action_trigger, module.aft.module.aft_feature_options.aws_lambda_function.aft_enable_cloudtrail (expand), module.aft.module.aft_feature_options.aws_lambda_function.aft_enable_cloudtrail, module.aft.module.aft_customizations.aws_iam_role_policy.aft_invoke_customizations_sfn (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.tag_account, module.aft.module.aft_account_provisioning_framework.aws_lambda_function.tag_account (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.create_role, module.aft.module.aft_account_provisioning_framework.aws_lambda_function.create_role (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.persist_metadata (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.persist_metadata, module.aft.module.aft_account_provisioning_framework.local.replacements_map (expand), module.aft.module.aft_account_provisioning_framework.aws_sfn_state_machine.aft_account_provisioning_framework_sfn (expand), module.aft.module.aft_account_provisioning_framework.output.state_machine_arn (expand), module.aft.module.aft_customizations.var.invoke_account_provisioning_sfn_arn (expand), module.aft.module.aft_customizations.aws_iam_role_policy.aft_invoke_customizations_sfn, module.aft.module.aft_account_request_framework.var.aft_common_layer_arn (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_cleanup_resources (expand), module.aft.module.aft_account_request_framework.aws_lambda_function.aft_cleanup_resources, module.aft.module.aft_account_provisioning_framework.var.aft_common_layer_arn (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.account_metadata_ssm (expand), module.aft.module.aft_account_provisioning_framework.aws_lambda_function.account_metadata_ssm, module.aft.module.aft_feature_options.aws_lambda_function.aft_delete_default_vpc (expand), module.aft.module.aft_feature_options.var.aft_common_layer_arn (expand), module.aft.module.aft_feature_options.aws_lambda_function.aft_delete_default_vpc, module.aft.module.aft_lambda_layer.aws_lambda_layer_version.layer_version (destroy deposed f43ae6d4), module.aft.module.aft_lambda_layer.aws_lambda_function.codebuild_invoker (destroy), module.aft.module.aft_lambda_layer.aws_lambda_layer_version.layer_version, module.aft.module.aft_lambda_layer.output.layer_version_arn (expand), module.aft.module.aft_customizations.var.aft_common_layer_arn (expand), module.aft.module.aft_customizations.aws_lambda_function.aft_customizations_execute_pipeline
1.9.2
から1.12.0
で変更が多かったためか、リソースの置き換えが上手くいっていない様子です。
1.12.0
に一気に上げるのは諦めて、一つ前の1.11.1
を挟んでみましょう。
アップデートの手順は同じです。再度、plan
すると今度はCycleエラーがでませんでした。
$ terraform plan # 省略 Plan: 2 to add, 26 to change, 5 to destroy.
apply
まで実行します。
$ terraform apply
apply
が成功したら、今度は1.12.0
に上げます。手順は同様です。
$ terraform plan # 省略 Plan: 8 to add, 21 to change, 5 to destroy.
apply
が成功することを確認できるはずです。
ここまで来たら、1つ目のStep Functionsのエラーは解消しているはずです。
再度「3.手動でStep Functionsステートマシンを実行」を試して、Step Functionsの実行が成功することを確認できました。
該当のパイプラインも正常に実行されました。
おわりに
「エラー2 Cycleエラー」に関しては、もう少し深堀りたかったですが大変そうだったので、とりあえず解決策だけ書きました。
手動でうまい具合にリソース消して上げれば、もしかしたら一気にバージョン上げれるかもしれません。
大変だと思うので、バージョン少し刻んで上げることをおすすめします。
以上、AWS事業本部の佐藤(@chari7311)でした。